'use strict'

/**
 * 用户是否已登录判断和异常捕获处理
 * @param {*} options 中间件的配置项，框架会将 app.config.middlewareName 传递进来
 * @param {*} app Application 实例
 */
module.exports = (options, app) => {
  return async (ctx, next) => {
    // 用户登录授权
    const userToken = ctx.get('Authorization') // 从请求头获取用户令牌
    if (userToken) {
      // 验证用户令牌的合法性
      const userInfo = await app.jwt.verify(userToken, app.config.security.secretKey)
      if (userInfo) {
        ctx.user = userInfo // 将用户信息绑定到ctx上下文
      }
    }

    // 应用授权
    const appToken = ctx.query.app_token || ctx.request.body.app_token
    if (appToken) {
      // 验证应用令牌的合法性
      const appInfo = await app.jwt.verify(appToken, app.config.security.secretKey)
      if (appInfo) {
        ctx.app = appInfo // 将应用信息绑定到ctx上下文
      }
    }

    await next() // 调用后续中间件
  }
}
